package com.liuyang.demo.mybatis.enums.handler;

import com.liuyang.demo.json.JSONCamelUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @描述 :
 * @作者 :	cs
 * @日期 :	2018/7/10
 * @时间 :	12:25
 */
public class JSONTypeHandler<E> extends BaseTypeHandler<E> {

    private final Class<E> type;

    /**
     * 设置配置文件设置的转换类以及枚举类内容，供其他方法更便捷高效的实现
     *
     * @param type 配置文件中设置的转换类
     */
    public JSONTypeHandler(Class<E> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.type = type;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        if (parameter != null) {
            ps.setString(i, JSONCamelUtils.writeValue(parameter));
        }
    }

    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 根据数据库存储类型决定获取类型
        String data = rs.getString(columnName);
        return rs.wasNull() ? null : convert(data);
    }

    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String data = rs.getString(columnIndex);
        return rs.wasNull() ? null : convert(data);
    }

    @Override
    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String data = cs.getString(columnIndex);
        return cs.wasNull() ? null : convert(data);
    }

    private E convert(String value) {
        if (value == null || value.isEmpty()) {
            try {
                return type.newInstance();
            } catch (Exception e) {
                return null;
            }
        }
        return JSONCamelUtils.readValue(value, type);
    }

}
